"""
基础模型模块
提供所有模型的基础类，包含通用字段如ID、创建/更新/删除时间等
"""
from datetime import datetime
from tortoise import fields
from tortoise.models import Model


class BaseModel(Model):
    """
    基础模型类
    提供所有模型通用的字段和方法
    """
    id = fields.IntField(pk=True, description="唯一标识ID")
    created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
    updated_at = fields.DatetimeField(auto_now=True, description="更新时间")
    deleted_at = fields.DatetimeField(null=True, description="删除时间（用于逻辑删除）")
    is_deleted = fields.BooleanField(default=False, description="是否已删除")

    class Meta:
        abstract = True  # 标记为抽象模型，不会创建数据库表

    def to_dict(self) -> dict:
        """
        将模型转换为字典
        :return: 包含模型字段的字典
        """
        result = {}
        for field in self._meta.fields:
            value = getattr(self, field)
            if isinstance(value, datetime):
                value = value.isoformat() if value else None
            result[field] = value
        return result

    async def soft_delete(self) -> None:
        """
        软删除记录（逻辑删除）
        更新逻辑删除标记和时间戳，而不是真正从数据库中删除记录
        """
        self.is_deleted = True
        self.deleted_at = datetime.now()
        await self.save(update_fields=["is_deleted", "deleted_at"])

    @classmethod
    async def get_by_id(cls, id: int):
        """
        通过ID获取记录（排除已逻辑删除的记录）
        :param id: 记录ID
        :return: 找到的记录或None
        """
        return await cls.filter(id=id, is_deleted=False).first()

    @classmethod
    async def exists_by_id(cls, id: int) -> bool:
        """
        检查指定ID的记录是否存在（排除已逻辑删除的记录）
        :param id: 记录ID
        :return: 是否存在
        """
        return await cls.filter(id=id, is_deleted=False).exists()

# uuid为主键的模型
class BaseModelUUID(BaseModel):
    """UUID主键模型"""
    id = fields.UUIDField(pk=True, description="唯一标识ID")
    created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
    updated_at = fields.DatetimeField(auto_now=True, description="更新时间")
    deleted_at = fields.DatetimeField(null=True, description="删除时间（用于逻辑删除）")
    is_deleted = fields.BooleanField(default=False, description="是否已删除")

    class Meta:
        abstract = True  # 标记为抽象模型，不会创建数据库表

    def to_dict(self) -> dict:
        """
        将模型转换为字典
        :return: 包含模型字段的字典
        """
        result = {}
        for field in self._meta.fields:
            value = getattr(self, field)
            if isinstance(value, datetime):
                value = value.isoformat() if value else None
            result[field] = value
        return result

    async def soft_delete(self) -> None:
        """
        软删除记录（逻辑删除）
        更新逻辑删除标记和时间戳，而不是真正从数据库中删除记录
        """
        self.is_deleted = True
        self.deleted_at = datetime.now()
        await self.save(update_fields=["is_deleted", "deleted_at"])

    @classmethod
    async def get_by_id(cls, id: int):
        """
        通过ID获取记录（排除已逻辑删除的记录）
        :param id: 记录ID
        :return: 找到的记录或None
        """
        return await cls.filter(id=id, is_deleted=False).first()

    @classmethod
    async def exists_by_id(cls, id: int) -> bool:
        """
        检查指定ID的记录是否存在（排除已逻辑删除的记录）
        :param id: 记录ID
        :return: 是否存在
        """
        return await cls.filter(id=id, is_deleted=False).exists()